home *** CD-ROM | disk | FTP | other *** search
- {$R-}
- UNIT HexWrite;
- (**) INTERFACE (**)
- TYPE HexString = String[9];
- BinString = String[32];
-
- FUNCTION HexByte(B : Byte) : HexString;
- FUNCTION HexShortInt(S : ShortInt) : HexString;
- FUNCTION HexWord(W : Word) : HexString;
- FUNCTION HexInteger(I : Integer) : HexString;
- FUNCTION HexLongInt(L : LongInt) : HexString;
- FUNCTION HexPointer(VAR P) : HexString;
-
- FUNCTION BinByte(B : Byte) : BinString;
- FUNCTION BinShortInt(S : ShortInt) : BinString;
- FUNCTION BinWord(W : Word) : BinString;
- FUNCTION BinInteger(I : Integer) : BinString;
- FUNCTION BinLongInt(L : LongInt) : BinString;
-
- FUNCTION NumBin(B : BinString) : LongInt;
- FUNCTION ANumBin(B : BinString) : LongInt;
- (**) IMPLEMENTATION (**)
- CONST
- HexDigits : ARRAY[0..15] OF Char = '0123456789ABCDEF';
- BinNibbles : ARRAY[0..15] OF ARRAY[0..3] OF Char = (
- '0000', '0001', '0010', '0011',
- '0100', '0101', '0110', '0111',
- '1000', '1001', '1010', '1011',
- '1100', '1101', '1110', '1111');
-
- FUNCTION HexByte(B : Byte) : HexString;
- VAR Temp : HexString;
- BEGIN
- Temp[0] := #2;
- Temp[1] := HexDigits[B SHR 4];
- Temp[2] := HexDigits[B AND $F];
- HexByte := Temp;
- END;
-
- FUNCTION HexShortInt(S : ShortInt) : HexString;
- BEGIN HexShortInt := HexByte(Byte(S)); END;
-
- FUNCTION HexWord(W : Word) : HexString;
- VAR Temp : HexString;
- BEGIN
- Temp[0] := #4;
- Temp[1] := HexDigits[W SHR 12];
- Temp[2] := HexDigits[(W SHR 8) AND $F];
- Temp[3] := HexDigits[(W SHR 4) AND $F];
- Temp[4] := HexDigits[W AND $F];
- HexWord := Temp;
- END;
-
- FUNCTION HexInteger(I : Integer) : HexString;
- BEGIN HexInteger := HexWord(Word(I)); END;
-
- FUNCTION HexLongInt(L : LongInt) : HexString;
- VAR Temp : HexString;
- BEGIN
- Temp[0] := #8;
- Temp[1] := HexDigits[L SHR 28];
- Temp[2] := HexDigits[(L SHR 24) AND $F];
- Temp[3] := HexDigits[(L SHR 20) AND $F];
- Temp[4] := HexDigits[(L SHR 16) AND $F];
- Temp[5] := HexDigits[(L SHR 12) AND $F];
- Temp[6] := HexDigits[(L SHR 8) AND $F];
- Temp[7] := HexDigits[(L SHR 4) AND $F];
- Temp[8] := HexDigits[L AND $F];
- HexLongInt := Temp;
- END;
-
- FUNCTION HexPointer(VAR P) : HexString;
- VAR
- Temp : HexString;
- L : LongInt ABSOLUTE P;
- BEGIN
- Temp := HexLongInt(L);
- Move(Temp[5], Temp[6], 4);
- Temp[5] := ':';
- Inc(Temp[0]);
- HexPointer := Temp;
- END;
-
- FUNCTION BinByte(B : Byte) : BinString;
- VAR Temp : BinString;
- BEGIN
- Temp[0] := #8;
- Move(BinNibbles[B SHR 4], Temp[1], 4);
- Move(BinNibbles[B AND $F], Temp[5], 4);
- BinByte := Temp;
- END;
-
- FUNCTION BinShortInt(S : ShortInt) : BinString;
- BEGIN BinShortInt := BinByte(Byte(S)); END;
-
- FUNCTION BinWord(W : Word) : BinString;
- VAR Temp : BinString;
- BEGIN
- Temp[0] := #16;
- Move(BinNibbles[W SHR 12], Temp[1], 4);
- Move(BinNibbles[(W SHR 8) AND $F], Temp[5], 4);
- Move(BinNibbles[(W SHR 4) AND $F], Temp[9], 4);
- Move(BinNibbles[W AND $F], Temp[13], 4);
- BinWord := Temp;
- END;
-
- FUNCTION BinInteger(I : Integer) : BinString;
- BEGIN BinInteger := BinWord(Word(I)); END;
-
- FUNCTION BinLongInt(L : LongInt) : BinString;
- VAR Temp : BinString;
- BEGIN
- Temp[0] := #32;
- Move(BinNibbles[L SHR 28], Temp[1], 4);
- Move(BinNibbles[(L SHR 24) AND $F], Temp[5], 4);
- Move(BinNibbles[(L SHR 20) AND $F], Temp[9], 4);
- Move(BinNibbles[(L SHR 16) AND $F], Temp[13], 4);
- Move(BinNibbles[(L SHR 12) AND $F], Temp[17], 4);
- Move(BinNibbles[(L SHR 8) AND $F], Temp[21], 4);
- Move(BinNibbles[(L SHR 4) AND $F], Temp[25], 4);
- Move(BinNibbles[L AND $F], Temp[29], 4);
- BinLongInt := Temp;
- END;
-
- FUNCTION NumBin(B : BinString) : LongInt;
- VAR Accum, Power : LongInt;
- P : Byte;
- BEGIN
- Power := 1; Accum := 0;
- FOR P := length(B) DOWNTO 1 DO
- BEGIN
- IF B[P] = '1' THEN Inc(Accum, Power);
- Power := PoweR SHL 1;
- END;
- NumBin := Accum;
- END;
-
- FUNCTION ANumBin(B : BinString) : LongInt; Assembler;
- ASM
- LES DI, B
- XOR CH, CH
- MOV CL, ES:[DI]
- ADD DI, CX
- MOV AX, 0
- MOV DX, 0
- MOV BX, 1
- MOV SI, 0
- @LOOP:
- CMP BYTE PTR ES:[DI],'1'
- JNE @NotOne
- ADD AX, BX {add power to accum}
- ADC DX, SI
- @NotOne:
- SHL SI, 1 {double power}
- SHL BX, 1
- ADC SI, 0
- DEC DI
- LOOP @LOOP
- END;
-
- END.